# make 显示详细编译过程
# make VERBOSE=1 或 make V=1

# make 命令指定 makefile 文件
# make -f Makefile.debug

# Debug模式,输出有关文件和检测时间的详细信息
# make -d

# 切换目录执行 make 命令
# make -c dir

# 带宏定义,LIBES会覆盖makefile中的定义
# make "LIBES= -LL -LS"

# KERNELRELEASE：由内核顶层Makefile自动定义,表示内核版本号。首次执行时未定义,因此会进入 else分支；内核构建系统介入后,该变量被定义,进入上半部分
# KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)
# 当执行 make 时,由于 KERNELRELEASE 未定义,进入 else分支
# 之后执行到 all 目标, -C 选项导致切换到内核源码目录,调用内核的顶层 Makefile, 
# M 选项告知内核构建系统需返回当前目录编译模块
# LLVM=1 LLVM_IAS=1：启用Clang/LLVM工具链（替代GCC）
# 内核顶层Makefile被调用后,会定义 KERNELRELEASE,并重新解析当前Makefile（二次解析）
# 此时 KERNELRELEASE已定义,因此执行上半部分
# 这时得到了编译目标的声明 obj-m,开始编译目标

ifneq ($(KERNELRELEASE),)

# include kbuild        # 新版本内核的机制。此处用于兼容老版本。
LOCAL_MODULE := test

$(LOCAL_MODULE)-objs := debugfs_test.o
obj-m := $(LOCAL_MODULE).o

# obj-m := test.o

else

# LOCAL 1:本地内核 0:开发板内核
LOCAL ?= 1
ARCH ?=
PWD ?= $(shell pwd)
CROSS_COMPILE ?=
EXTRA_CFLAGS ?=

# Clang工具链路径
# ANDROID_SOURCE_PATH := /home/hgc/coding/rk3588-atk-android/android13_v1.2_250104
# CLANG_PATH := $(ANDROID_SOURCE_PATH)/prebuilts/clang/host/linux-x86/clang-r450784d/bin/clang

BD_KDIR ?= /home/hgc/coding/rk3588-atk-android/android13_v1.2_250104/kernel-5.10

ifeq ($(LOCAL),0)
  	BUILD_MSG := "编译开发板驱动(内核: $(BD_KDIR))"
	ARCH := arm64
	CROSS_COMPILE := aarch64-linux-gnu-
	KDIR ?= $(BD_KDIR)
	LOCAL_CFLAGS := LLVM=1 LLVM_IAS=1
else
  	BUILD_MSG := "编译本地驱动"
	ARCH := x86_64
	CROSS_COMPILE :=
	KDIR ?= /lib/modules/$(shell uname -r)/build
	LOCAL_CFLAGS :=
endif

# EXTRA_CFLAGS += -Werror -Wuninitialized

# -C ：将当前工作目录,转移到指定的位置并编译。
# M= ：make modules 命令编译模块前,返回到模块代码路径。modules 目标指向 obj-m 变量
all:
	@echo $(BUILD_MSG)
	make CROSS_COMPILE=$(CROSS_COMPILE) $(LOCAL_CFLAGS) ARCH=$(ARCH) -C $(KDIR)  M=$(PWD) modules
# $(MAKE) ARCH=$(ARCH) CC=$(CLANG_PATH) CROSS_COMPILE=$(CROSS_COMPILE) LLVM=1 LLVM_IAS=1 KCFLAGS="$(EXTRA_CFLAGS)" -C $(KDIR) M=$(PWD) modules

clean:
	make -C $(KDIR) M=$(PWD) clean
# rm -rf *.o *~ core .depend *.ko *.mod.c .tmp_versions Module* modules*

endif
